package com.wing.order.model.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.enums.IEnum;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.wing.mybatis.common.BaseEntity;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 入库单
 *
 * @author
 */
@Data
@NoArgsConstructor
@Accessors(chain = true)
@TableName("ord_inventory_inout")
public class InventoryInout extends BaseEntity<InventoryInout> implements Serializable {

    private static final long serialVersionUID = 1L;

    public enum TransportType implements IEnum<Integer> {

        /**
         * 快递运输
         */
        logistics(0,"快递运输"),
        /**
         * 快递运输
         */
        express(1,"快递运输"),
        /**
         * 自行运输
         */
        self(2,"自行运输");

        private int code;
        private String desc;

        TransportType(int code,String desc){
            this.code=code;
            this.desc=desc;
        }

        @Override
        public Integer getValue(){
            return this.code;
        }

        public String getDesc(){
            return this.desc;
        }
    }

    public enum Status implements IEnum<Integer> {

        /**
         * 待入库
         */
        stockup(0,"待入库"),
        /**
         * 入库中
         */
        storagein(1,"入库中"),
        /**
         * 入库完成
         */
        storage(2,"入库完成");


        private int code;
        private String desc;

        Status(int code,String desc){
            this.code=code;
            this.desc=desc;
        }

        @Override
        public Integer getValue(){
            return this.code;
        }

        public String getDesc(){
            return this.desc;
        }
    }

    public enum StorageType implements IEnum<Integer> {

        /**
         * 生产入库
         */
        production(1,"生产入库"),
        /**
         * 采购入库
         */
        purchase(2,"采购入库"),
        /**
         * 调拨入库
         */
        allot(3,"调拨入库"),
        /**
         * 盘点入库
         */
        check(4,"盘点入库"),
        /**
         * 换货入库
         */
        barter(5,"换货入库"),
        /**
         * 报损入库
         */
        breakage(6,"报损入库"),
        /**
         * 签收刀具入库
         */
        cutter(7,"签收刀具入库");

        private int code;
        private String desc;

        StorageType(int code,String desc){
            this.code=code;
            this.desc=desc;
        }

        @Override
        public Integer getValue(){
            return this.code;
        }

        public String getDesc(){
            return this.desc;
        }
    }

    /**
     * 创建者
     */
    private Long creator;

    /**
     * 修改者
     */
    private Long modifier;

    /**
     * 创建人
     */
    private String creatorName;

    /**
     * 修改人
     */
    private String modifierName;

    /**
     * 入库单编号
     */
    private String code;

    /**
     * 客户名称
     */
    private String customerName;

    /**
     * 出货仓库
     */
    private Long warehouseId;

    /**
     * 客户联系人
     */
    private String customerConcat;

    /**
     * 联系人电话
     */
    private String customerMoble;

    /**
     * 车牌号
     */
    private String carNo;

    /**
     * 物流单号
     */
    private String expressCode;

    /**
     * 物流企业id
     */
    private Long companyId;

    /**
     * 运输方式
     */
    private TransportType transportType;

    /**
     * 运输方式描述
     */
    @TableField(exist = false)
    private String transportTypeDesc;

    public String getTransportTypeDesc() {
        return transportType == null ? null : transportType.getDesc();
    }

    /**
     * 货值
     */
    private BigDecimal total;

    /**
     * 企业id
     */
    private Long enterpriseId;

    /**
     * 省
     */
    private Long province;

    /**
     * 市
     */
    private Long city;

    /**
     * 区
     */
    private Long area;

    /**
     * 详情地址
     */
    private String address;

    /**
     * 状态
     */
    private Status status;

    /**
     * 状态描述
     */
    @TableField(exist = false)
    private String statusDesc;

    public String getStatusDesc() {
        return status == null ? null : status.getDesc();
    }

    /**
     * 刀柜数
     */
    private Long cabNum;

    /**
     * 入库类型
     */
    private StorageType storageType;

    /**
     * 入库类型描述
     */
    @TableField(exist = false)
    private String storageTypeDesc;

    public String getStorageTypeDesc() {
        return storageType == null ? null : storageType.getDesc();
    }

    /**
     * 产品规格ID
     */
    private Long specId;

    /**
     * 产品规格码
     */
    private String specCode;

    /**
     * 产品SKU id
     */
    private Long skuId;

    /**
     * 产品SKU编号
     */
    private String skuCode;

    /**
     * 产品类型
     */
    private String productType;

    /**
     * 单位名称
     */
    private String unitName;

    /**
     * 产品单位id
     */
    private Long unitId;

    /**
     * 产品编号
     */
    private String productCode;

    /**
     * 生产计划编号
     */
    private String productionPlanCode;

    /**
     * 生产计划id
     */
    private Long productionPlanId;

    /**
     * 产品生产部门
     */
    private String productionDepartment;

    /**
     * 产品生产部门id
     */
    private Long productionDepartmentId;

    /**
     * 生产台机工位
     */
    private String productionMachine;

    /**
     * 生产台机工位id
     */
    private Long productionMachineId;

    /**
     * 送料数量
     */
    private Long feedQuantity;

    /**
     * 生产负责人名称
     */
    private String manufactureHeadName;

    /**
     * 生产负责人id
     */
    private Long manufactureHeadId;

    /**
     * 提交时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime submissionTime;

    /**
     * 送料人
     */
    private String feedingPeople;

    /**
     * AGV送料指令
     */
    private String avgFeedCode;

    /**
     * 入库时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime storageTime;

    /**
     * 入库送料人
     */
    private Long feedingPeopleId;

    /**
     * 入库单位名称
     */
    private String storageUnitName;

    /**
     * 入库单位id
     */
    private Long storageUnitId;

    /**
     * 包装方案
     */
    private String pageScheme;

    /**
     * 包装方案id
     */
    private Long pageSchemeId;

    private String remark;

    private String warehouseName;
    /**
     * 序号
     */
    private Integer No;

    private Integer day;
    /**
     * 产品分类id
     */
    private Long productTypeId;
    /**
     * 入库数
     */
    @TableField(exist = false)
    private Integer quantityTotal;
    /**
     * 结存数
     */
    @TableField(exist = false)
    private Integer balanceTotal;

    /**
     * 出入库类型code
     */
    private String inoutTypeCode;
    /**
     * 入库类型名称
     */
    private String inoutTypeName;
    /**
     * 商品sku数量
     */
    @TableField(exist = false)
    private Long productNum;
    /**
     * 入库包装数量
     */
    @TableField(exist = false)
    private Long packLabelNum;
}
